﻿'######################################################################################################################################
'# CLASSE EXPLORER:
'#  - Gere l'exploration de fichiers (sauf la partie affichage):
'#     Pour le type:
'#     0 = source
'#     1 = repertoire
'#     2 = dvd repertoire
'#     3 = dvd iso
'#     4 = divx fichier
'#     Pour le type:
'######################################################################################################################################
Imports System.IO
Imports System.ComponentModel
Imports SMC.Gestion_XML
Imports MediaPortal.GUI.Library


Public Class Explorer
    Private _Parent As Plugin

    Public INT_Source_Selection As Integer

    Public INT_Fichier_PositionRelative As Integer
    Public INT_Fichier_PositionAbsolue As Integer

    Public STR_Repertoire_Courant As String

    Public VideoElements() As STRUC_VideoElement

    Public STR_Jaquettes_permantentes() As String

    Public Structure STRUC_VideoElement
        Dim Nom As String
        Dim Chemin As String
        Dim Type As Integer
        Dim Vu As Integer
        Dim Synopsis As String
        Dim Position As String
        Dim DVDPosition As String
        Dim Duree As String
    End Structure

    Public WithEvents BCK_WORKER_Jaquette As System.ComponentModel.BackgroundWorker

    '######################################################################################################################################
    '# Constructeur
    '######################################################################################################################################
    Sub New(ByVal CLASS_Param1 As Plugin)
        _Parent = CLASS_Param1

        'On parametre le backgroundworker pour le rafraichissement des jaquettes
        BCK_WORKER_Jaquette = New BackgroundWorker
        BCK_WORKER_Jaquette.WorkerReportsProgress = True
        BCK_WORKER_Jaquette.WorkerSupportsCancellation = True

        'On charge les sources dans l'explorateur
        ACTION_Source()

        ReDim STR_Jaquettes_permantentes(-1)

        EXPLORER_Rafraichir()
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Rafraichi la jaquette dans un autre thread
    '######################################################################################################################################
    Private Sub BCK_WORKER_Jaquette_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BCK_WORKER_Jaquette.DoWork
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de BCK_WORKER_Jaquette_DoWork()", "")
        Dim STR_Fichier_courant As String
        Dim i As Integer
        Dim BOOL_existe As Boolean
        Dim STR_repertoire_jaquette As String

        STR_Fichier_courant = ""
        'Tant que la sélection a changé pendant le traitement
        While STR_Fichier_courant <> VideoElements(INT_Fichier_PositionAbsolue).Chemin
            'On sauvegarde le fichier en cours de traitement (qui est la selection à l'instant T)
            STR_Fichier_courant = VideoElements(INT_Fichier_PositionAbsolue).Chemin


            'Suppression des elements permanents inutiles
            If UBound(STR_Jaquettes_permantentes) >= 0 Then
                For i = 0 To UBound(STR_Jaquettes_permantentes)
                    'Si on est plus dans la meme sous arborescence, on supprime l'element de la liste permantente
                    If STR_Jaquettes_permantentes(i) <> Left(STR_Fichier_courant, Len(STR_Jaquettes_permantentes(i))) Then
                        If i < UBound(STR_Jaquettes_permantentes) Then
                            Array.Copy(STR_Jaquettes_permantentes, i + 1, STR_Jaquettes_permantentes, i, STR_Jaquettes_permantentes.Length - 2)
                        End If
                        ReDim Preserve STR_Jaquettes_permantentes(UBound(STR_Jaquettes_permantentes) - 1)
                    End If
                Next
            Else
                ReDim STR_Jaquettes_permantentes(-1)
            End If

            'Si ce fichier contient une jaquette alors on affiche la jaquette
            If File.Exists(STR_Fichier_courant & ".j.smc") Then

                'On ajoute le fichier dans la liste permanente seulement s'il n'y est pas encore
                'on gere les jaquettes repertoire
                BOOL_existe = False
                For i = 0 To UBound(STR_Jaquettes_permantentes)
                    If STR_Jaquettes_permantentes(i) = STR_Fichier_courant Then BOOL_existe = True
                Next
                If VideoElements(INT_Fichier_PositionAbsolue).Type <= 1 And BOOL_existe = False Then
                    ReDim Preserve STR_Jaquettes_permantentes(UBound(STR_Jaquettes_permantentes) + 1)
                    STR_Jaquettes_permantentes(UBound(STR_Jaquettes_permantentes)) = STR_Fichier_courant
                End If
                'On affiche la jaquette
                _Parent.SKINIMG_Jaquette.SetFileName(STR_Fichier_courant & ".j.smc")
            Else
                'On cherche si un element permanent correspond
                STR_repertoire_jaquette = ""
                If UBound(STR_Jaquettes_permantentes) >= 0 Then
                    For i = 0 To UBound(STR_Jaquettes_permantentes)
                        If Left(STR_Fichier_courant, Len(STR_Jaquettes_permantentes(i))) = STR_Jaquettes_permantentes(i) Then
                            STR_repertoire_jaquette = STR_Jaquettes_permantentes(i) & ".j.smc"
                        End If
                    Next
                End If
                'On affiche la jaquette
                _Parent.SKINIMG_Jaquette.SetFileName(STR_repertoire_jaquette)
            End If

        End While
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Rafraichir completement l'interface explorer
    '######################################################################################################################################
    Public Sub EXPLORER_Rafraichir()
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de EXPLORER_Rafraichir()", "")
        Dim STR_NomAffiche As String

        'Si on a pas d'elements, alors on n'affiche pas le separateur du haut
        If UBound(VideoElements) = -1 Then
            _Parent.SMC_Skin.SKINSKINIMG_Separateur_Visible(0, False)
        Else
            _Parent.SMC_Skin.SKINSKINIMG_Separateur_Visible(0, True)
        End If
        'Gestion des elements fichiers
        For i = 0 To 14
            If i <= UBound(VideoElements) Then
                _Parent.SMC_Skin.SKINSKINIMG_Separateur_Visible(i + 1, True)
                STR_NomAffiche = VideoElements(i + INT_Fichier_PositionAbsolue - INT_Fichier_PositionRelative).Nom
                If VideoElements(i + INT_Fichier_PositionAbsolue - INT_Fichier_PositionRelative).Type > 2 Then STR_NomAffiche = Left(STR_NomAffiche, InStrRev(STR_NomAffiche, ".") - 1)
                Select Case VideoElements(i + INT_Fichier_PositionAbsolue - INT_Fichier_PositionRelative).Vu
                    Case 0
                        _Parent.SMC_Skin.SKINLBL_Texte_Label(i, "&HEEAAAAAA", STR_NomAffiche)
                        _Parent.SMC_Skin.SKINIMG_Vu_Setfilename(i, "")
                    Case 1
                        _Parent.SMC_Skin.SKINLBL_Texte_Label(i, "&HAAAAAAAA", STR_NomAffiche)
                        _Parent.SMC_Skin.SKINIMG_Vu_Setfilename(i, "SMC\en_cours.png")
                    Case 2
                        _Parent.SMC_Skin.SKINLBL_Texte_Label(i, "&HAA707070", STR_NomAffiche)
                        _Parent.SMC_Skin.SKINIMG_Vu_Setfilename(i, "SMC\vu.png")
                End Select
                Select Case VideoElements(i + INT_Fichier_PositionAbsolue - INT_Fichier_PositionRelative).Type
                    Case 0
                        _Parent.SMC_Skin.SKINIMG_Type_Setfilename(i, "")
                    Case 1
                        _Parent.SMC_Skin.SKINIMG_Type_Setfilename(i, "SMC\repertoire.png")
                    Case 2
                        _Parent.SMC_Skin.SKINIMG_Type_Setfilename(i, "SMC\dvd.png")
                    Case 3
                        _Parent.SMC_Skin.SKINIMG_Type_Setfilename(i, "SMC\dvd.png")
                    Case 4
                        _Parent.SMC_Skin.SKINIMG_Type_Setfilename(i, "SMC\divx.png")
                End Select
            Else
                _Parent.SMC_Skin.SKINSKINIMG_Separateur_Visible(i + 1, False)
                _Parent.SMC_Skin.SKINLBL_Texte_Label(i, "&H00000000", "")
                _Parent.SMC_Skin.SKINIMG_Vu_Setfilename(i, "")
                _Parent.SMC_Skin.SKINIMG_Type_Setfilename(i, "")
            End If
        Next

        'Gestion de l'image Page Haut
        If INT_Fichier_PositionAbsolue <> INT_Fichier_PositionRelative Then
            _Parent.SKINIMG_Page_Haut.Visible = True
        Else
            _Parent.SKINIMG_Page_Haut.Visible = False
        End If
        ''Gestion de l'image Page Bas
        If INT_Fichier_PositionAbsolue - INT_Fichier_PositionRelative + 15 <= UBound(VideoElements) Then
            _Parent.SKINIMG_Page_Bas.Visible = True
        Else
            _Parent.SKINIMG_Page_Bas.Visible = False
        End If

        ''On place le curseur
        _Parent.SKINIMG_Curseur.YPosition = (82 + (INT_Fichier_PositionRelative * 40)) * _Parent.SKINIMG_Fond_Ecran.Height / 720

        ''Affichage du titre
        If INT_Source_Selection = -1 Then
            _Parent.SKINLBL_Titre.Label = "Home"
        Else
            'Pour correction de BUG: Si on arrive a une racine de disque alors il faut ajouter a la fin un "\" (c: NOK;c:\ OK)
            If Right(STR_Repertoire_Courant, 2) = ":\" Then
                _Parent.SKINLBL_Titre.Label = Left(STR_Repertoire_Courant, 1)
            Else
                _Parent.SKINLBL_Titre.Label = Mid(STR_Repertoire_Courant, InStrRev(STR_Repertoire_Courant, "\") + 1)
            End If
        End If

        ''Affichage du synopsis
        If UBound(VideoElements) > -1 Then
            _Parent.SKINTXT_Synopsis.Label = VideoElements(INT_Fichier_PositionAbsolue).Synopsis
        Else
            _Parent.SKINTXT_Synopsis.Label = ""
        End If

        ''Affichage de la jaquette (gere pas un autre thread)
        If BCK_WORKER_Jaquette.IsBusy = False Then
            BCK_WORKER_Jaquette.RunWorkerAsync()
        End If
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Explorer vers le bas
    '######################################################################################################################################
    Public Sub ACTION_Bas()
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de ACTION_Bas()", "")
        'Si on est pas au dernier element alors
        If INT_Fichier_PositionAbsolue < UBound(VideoElements) Then
            INT_Fichier_PositionAbsolue += 1
            'Si le curseur n'est pas tout en bas alors
            If INT_Fichier_PositionRelative < 14 Then
                INT_Fichier_PositionRelative += 1
            End If
        End If
        EXPLORER_Rafraichir()
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Explorer vers le haut
    '######################################################################################################################################
    Public Sub ACTION_Haut()
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de ACTION_Haut()", "")
        'Si on est pas au premier fichier alors
        If INT_Fichier_PositionAbsolue > 0 Then
            INT_Fichier_PositionAbsolue -= 1
            'Si le curseur n'est pas tout en haut alors
            If INT_Fichier_PositionRelative > 0 Then
                INT_Fichier_PositionRelative -= 1
            End If
        End If
        EXPLORER_Rafraichir()
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Explorer vers la source
    '######################################################################################################################################
    Public Sub ACTION_Source()
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de ACTION_Source()", "")
        Dim Videoparam_Element As SMC.Configuration.STRUC_Videoparam

        ' -1 = pas de source selectionne
        INT_Source_Selection = -1
        ReDim VideoElements(-1)

        For Each Videoparam_Element In _Parent.SMC_Configuration.Video
            ReDim Preserve VideoElements(UBound(VideoElements) + 1)
            VideoElements(UBound(VideoElements)).Nom = Videoparam_Element.Nom
            VideoElements(UBound(VideoElements)).Chemin = Videoparam_Element.Chemin
            VideoElements(UBound(VideoElements)).Vu = 0
            VideoElements(UBound(VideoElements)).Type = 0
            VideoElements(UBound(VideoElements)).Synopsis = ""
            VideoElements(UBound(VideoElements)).Position = -1
            VideoElements(UBound(VideoElements)).DVDPosition = ""
            VideoElements(UBound(VideoElements)).Duree = -1
        Next

        'On reinitialise la position du curseur
        INT_Fichier_PositionRelative = 0
        INT_Fichier_PositionAbsolue = 0
        'on rafraichi l'explorer
        EXPLORER_Rafraichir()
    End Sub

    '######################################################################################################################################
    '# Explorer le repertoire
    '######################################################################################################################################
    Public Sub ACTION_SelectionnerRepertoire(ByVal STR_Param1 As String)
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de ACTION_SelectionnerRepertoire()", "")
        Dim Temp_VideoElement As STRUC_VideoElement
        Dim FLAG_Acces_OK As Boolean
        Dim OBJ_Repertoire As IO.DirectoryInfo
        Dim OBJ_Fichier As IO.FileInfo
        Dim OBJ_SousRepertoire As IO.DirectoryInfo
        Dim STR_Repertoire_Precedent As String
        Dim i As Integer
        Dim j As Integer
        Dim XML_Contenu As STRUC_XML_smc

        'On enregistre le repertoire precendent
        STR_Repertoire_Precedent = STR_Repertoire_Courant
        'On enregistre le repertoire courant
        STR_Repertoire_Courant = STR_Param1

        'Pour correction de BUG: Si on arrive a une racine de disque alors il faut ajouter a la fin un "\" (c: NOK;c:\ OK)
        If Right(STR_Repertoire_Courant, 1) = ":" Then STR_Repertoire_Courant = STR_Repertoire_Courant & "\"

        'Si on quitte la source alors on memorise sa position
        If INT_Source_Selection = -1 Then INT_Source_Selection = INT_Fichier_PositionAbsolue

        'on vide la liste
        ReDim VideoElements(-1)

        'On reinitialise la position du curseur
        INT_Fichier_PositionRelative = 0
        INT_Fichier_PositionAbsolue = 0

        'On charge le contenu du repertoire
        OBJ_Repertoire = New IO.DirectoryInfo(STR_Repertoire_Courant)

        'on test l'acces au contenu du repertoire
        FLAG_Acces_OK = True
        Try
            OBJ_Repertoire.GetFiles()
        Catch
            FLAG_Acces_OK = False
        End Try

        'si on accede au repertoire on continue
        If FLAG_Acces_OK Then
            'On lit tous les repertoires
            For Each OBJ_SousRepertoire In OBJ_Repertoire.GetDirectories
                ReDim Preserve VideoElements(UBound(VideoElements) + 1)
                VideoElements(UBound(VideoElements)).Nom = OBJ_SousRepertoire.Name
                VideoElements(UBound(VideoElements)).Chemin = OBJ_SousRepertoire.FullName
                If Directory.Exists(OBJ_SousRepertoire.FullName & "\VIDEO_TS") Then
                    VideoElements(UBound(VideoElements)).Type = 2
                    XML_Contenu = _Parent.SMC_Gestion_XML.LireElements(OBJ_SousRepertoire.FullName & ".smc")
                    VideoElements(UBound(VideoElements)).Vu = XML_Contenu.Vu
                    VideoElements(UBound(VideoElements)).Synopsis = XML_Contenu.Synopsis
                    VideoElements(UBound(VideoElements)).Position = XML_Contenu.Position
                    VideoElements(UBound(VideoElements)).DVDPosition = XML_Contenu.DVDPosition
                    VideoElements(UBound(VideoElements)).Duree = XML_Contenu.Duree
                Else
                    VideoElements(UBound(VideoElements)).Type = 1
                    VideoElements(UBound(VideoElements)).Vu = 0
                    VideoElements(UBound(VideoElements)).Synopsis = ""
                    VideoElements(UBound(VideoElements)).Position = -1
                    VideoElements(UBound(VideoElements)).DVDPosition = ""
                    VideoElements(UBound(VideoElements)).Duree = -1
                End If
            Next

            'On lit tous les fichiers
            For Each OBJ_Fichier In OBJ_Repertoire.GetFiles
                'Si le fichier a une extention
                If OBJ_Fichier.Extension <> "" Then
                    'Si l'extention est accepté dans les parametes mediaportal
                    If InStr(LCase(_Parent.SMC_Configuration.Iso_Extentions & _Parent.SMC_Configuration.Video_Extentions), LCase(OBJ_Fichier.Extension)) Then
                        ReDim Preserve VideoElements(UBound(VideoElements) + 1)
                        VideoElements(UBound(VideoElements)).Nom = OBJ_Fichier.Name
                        VideoElements(UBound(VideoElements)).Chemin = OBJ_Fichier.FullName
                        If InStr(LCase(_Parent.SMC_Configuration.Iso_Extentions), LCase(OBJ_Fichier.Extension)) Then VideoElements(UBound(VideoElements)).Type = 3
                        If InStr(LCase(_Parent.SMC_Configuration.Video_Extentions), LCase(OBJ_Fichier.Extension)) Then VideoElements(UBound(VideoElements)).Type = 4
                        XML_Contenu = _Parent.SMC_Gestion_XML.LireElements(OBJ_Fichier.FullName & ".smc")
                        VideoElements(UBound(VideoElements)).Vu = XML_Contenu.Vu
                        VideoElements(UBound(VideoElements)).Synopsis = XML_Contenu.Synopsis
                        VideoElements(UBound(VideoElements)).Position = XML_Contenu.Position
                        VideoElements(UBound(VideoElements)).DVDPosition = XML_Contenu.DVDPosition
                        VideoElements(UBound(VideoElements)).Duree = XML_Contenu.Duree
                    End If
                End If
            Next
        End If

        'On tri tous les fichiers avec les dossiers
        If UBound(VideoElements) > -1 Then
            For i = 0 To UBound(VideoElements)
                For j = 0 To UBound(VideoElements)
                    If (String.Compare(UCase(VideoElements(i).Nom), UCase(VideoElements(j).Nom)) < 0) Then
                        Temp_VideoElement.Nom = VideoElements(i).Nom
                        Temp_VideoElement.Chemin = VideoElements(i).Chemin
                        Temp_VideoElement.Type = VideoElements(i).Type
                        Temp_VideoElement.Vu = VideoElements(i).Vu
                        Temp_VideoElement.Synopsis = VideoElements(i).Synopsis
                        Temp_VideoElement.Position = VideoElements(i).Position
                        Temp_VideoElement.DVDPosition = VideoElements(i).DVDPosition
                        Temp_VideoElement.Duree = VideoElements(i).Duree

                        VideoElements(i).Nom = VideoElements(j).Nom
                        VideoElements(i).Chemin = VideoElements(j).Chemin
                        VideoElements(i).Type = VideoElements(j).Type
                        VideoElements(i).Vu = VideoElements(j).Vu
                        VideoElements(i).Synopsis = VideoElements(j).Synopsis
                        VideoElements(i).Position = VideoElements(j).Position
                        VideoElements(i).DVDPosition = VideoElements(j).DVDPosition
                        VideoElements(i).Duree = VideoElements(j).Duree

                        VideoElements(j).Nom = Temp_VideoElement.Nom
                        VideoElements(j).Chemin = Temp_VideoElement.Chemin
                        VideoElements(j).Type = Temp_VideoElement.Type
                        VideoElements(j).Vu = Temp_VideoElement.Vu
                        VideoElements(j).Synopsis = Temp_VideoElement.Synopsis
                        VideoElements(j).Position = Temp_VideoElement.Position
                        VideoElements(j).DVDPosition = Temp_VideoElement.DVDPosition
                        VideoElements(j).Duree = Temp_VideoElement.Duree
                    End If
                Next
            Next

            'Si on a fait un retour, on positionne le curseur sur l'element precedent
            For i = 0 To UBound(VideoElements)
                If VideoElements(i).Chemin = STR_Repertoire_Precedent Then
                    INT_Fichier_PositionAbsolue = i
                    If i <= 14 Then
                        INT_Fichier_PositionRelative = i
                    Else
                        INT_Fichier_PositionRelative = 14
                    End If
                End If
            Next

        End If

        'on rafraichi l'explorer
        EXPLORER_Rafraichir()
    End Sub
    '######################################################################################################################################

    Public Function Selection_Nom()
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de Selection_Nom()", "")
        Return VideoElements(_Parent.SMC_Explorer.INT_Fichier_PositionAbsolue).Nom
    End Function
    Public Function Selection_Nom_Sans_Extention()
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de Selection_Nom_Sans_Extention()", "")
        Dim INT_Extention As Integer

        INT_Extention = InStrRev(_Parent.SMC_Explorer.Selection_Nom, ".") - 1
        If INT_Extention >= 0 Then
            Return Left(_Parent.SMC_Explorer.Selection_Nom, INT_Extention)
        Else
            Return _Parent.SMC_Explorer.Selection_Nom
        End If
    End Function
    Public Function Selection_Extention()
        MediaPortal.GUI.Library.Log.Debug("[SMC] Explorer.vb >> Execution de Selection_Extention()", "")
        Dim INT_Extention As Integer

        INT_Extention = InStrRev(_Parent.SMC_Explorer.Selection_Chemin, ".")
        If INT_Extention > 0 Then
            Return Mid(_Parent.SMC_Explorer.Selection_Chemin, INT_Extention)
        Else
            Return ""
        End If
    End Function
    Public Function Selection_Chemin()
        Return VideoElements(_Parent.SMC_Explorer.INT_Fichier_PositionAbsolue).Chemin
    End Function
    Public Function Selection_Type()
        Return VideoElements(_Parent.SMC_Explorer.INT_Fichier_PositionAbsolue).Type
    End Function
    Public Function Selection_Position()
        Return VideoElements(_Parent.SMC_Explorer.INT_Fichier_PositionAbsolue).Position
    End Function
    Public Function Selection_Duree()
        Return VideoElements(_Parent.SMC_Explorer.INT_Fichier_PositionAbsolue).Duree
    End Function

End Class